package com.groupbuying.customer.service.impl;

import com.groupbuying.customer.service.PictureCodeService;
import org.springframework.stereotype.Service;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * @anthor wenguoqiang
 * @date: 2019/01/15 17:03
 * @company 蒙泰互联网公司
 * @des
 **/
@Service
public class PictureCodeServiceImpl implements PictureCodeService {


    /**
     * 字体，Fixedsys字体验证码使用
     */
    public static final String FONT_FIXEDSYS = "Fixedsys";

    /**
     * 字体，新罗马字体验证码使用
     */
    public static final String FONT_TIMES_NEW_ROMAN = "Times New Roman";

   /* @Autowired
    private ValidateCode_P2Service code_P2Service;*/

    private Random random = new Random();

    /**
     * 获得字体
     */
    private Font getFont() {
        return new Font(FONT_FIXEDSYS, Font.CENTER_BASELINE, 18);
    }

    /**
     * 获得颜色
     */
    private Color getRandColor(int fc, int bc) {
        if (fc > 255)
            fc = 255;
        if (bc > 255)
            bc = 255;
        int r = fc + random.nextInt(bc - fc - 16);
        int g = fc + random.nextInt(bc - fc - 14);
        int b = fc + random.nextInt(bc - fc - 18);
        return new Color(r, g, b);
    }

    /**
     * 生成随机验证码图片
     * return map:
     * key=code 是生成的验证码字符串
     * key=bufferedImage 是生成的验证码图片
     */
    public Map<String,Object> getRandcode() {
        Map<String,Object> map = new HashMap<String,Object>();
        //获取验证码设置基础信息 默认获取   1.登陆的验证码
        //M validateCodeModel = (M) code_P2Service.getValidateCodeForType("1");
       /* if(validateCodeModel!=null){
            // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
            BufferedImage image = new BufferedImage(validateCodeModel.getWidth(), validateCodeModel.getHeight(),
                    BufferedImage.TYPE_INT_BGR);
            Graphics g = this.drowGraphics_P2(image);
            // 绘制干扰线
            for (int i = 0; i <= validateCodeModel.getLineSize(); i++) {
                drawLine(g,validateCodeModel.getWidth(), validateCodeModel.getHeight());
            }
            // 绘制随机字符
            String randomString = "";
            for (int i = 1; i <= validateCodeModel.getStringNum(); i++) {
                randomString = drowString_P2(g, randomString, i, validateCodeModel.getRandString());
            }
            map.put("code", randomString);
            map.put("bufferedImage", image);
        }*/
        int width = 65, height = 25;
        // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
        BufferedImage image = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_BGR);
        Graphics g = this.drowGraphics(image);
        // 绘制干扰线
        for (int i = 0; i <= 30; i++) {
            drawLine(g,width, height);
        }
        // 绘制随机字符
        String randomString = "";
        for (int i = 1; i <= 4; i++) {
            randomString = drowString(g, randomString, i, "abcderqerzdfaerq123456789");
        }
        map.put("code", randomString);
        map.put("bufferedImage", image);
        return map;
    }

    /**
     * 生成随机验证码图片，根据传入的数量，生成特定位数的验证码
     * @param type 验证码类型：1.登陆 2.修改密码 3.注册
     * return Map<String,Object>
     * key=code 是生成的验证码字符串
     * key=bufferedImage 是生成的验证码图片
     */
    public Map<String,Object> getRandcodeForType(String type){
        Map<String,Object> map = new HashMap<String,Object>();
        /*//获取验证码设置基础信息
        M validateCodeModel = (M) code_P2Service.getValidateCodeForType(type);
        if(validateCodeModel!=null){
            // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
            BufferedImage image = new BufferedImage(validateCodeModel.getWidth(), validateCodeModel.getHeight(),
                    BufferedImage.TYPE_INT_BGR);
            Graphics g = this.drowGraphics_P2(image);
            // 绘制干扰线
            for (int i = 0; i <= validateCodeModel.getLineSize(); i++) {
                drawLine(g,validateCodeModel.getWidth(), validateCodeModel.getHeight());
            }
            // 绘制随机字符
            String randomString = "";
            for (int i = 1; i <= validateCodeModel.getStringNum(); i++) {
                randomString = drowString(g, randomString, i, validateCodeModel.getRandString());
            }
            map.put("code", randomString);
            map.put("bufferedImage", image);
        }*/
        return map;
    }

    /**
     * 生成随机验证码图片，根据传入的数量，生成特定位数的验证码
     * @param validateCodeModel 验证码基础参数
     * return Map<String,Object>
     * key=code 是生成的验证码字符串
     * key=bufferedImage 是生成的验证码图片
     */
    public Map<String,Object> getRandcodeForVcm(Object validateCodeModel){
        Map<String,Object> map = new HashMap<String,Object>();
       /* if(validateCodeModel!=null){
            // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
            BufferedImage image = new BufferedImage(validateCodeModel.getWidth(), validateCodeModel.getHeight(),
                    BufferedImage.TYPE_INT_BGR);
            Graphics g = this.drowGraphics_P2(image);
            // 绘制干扰线
            for (int i = 0; i <= validateCodeModel.getLineSize(); i++) {
                drawLine(g,validateCodeModel.getWidth(), validateCodeModel.getHeight());
            }
            // 绘制随机字符
            String randomString = "";
            for (int i = 1; i <= validateCodeModel.getStringNum(); i++) {
                randomString = drowString(g, randomString, i, validateCodeModel.getRandString());
            }
            map.put("code", randomString);
            map.put("bufferedImage", image);
        }*/
        return map;
    }

    /**
     * 绘制画布
     * @param image
     * @return 返回设置好的画布
     */
    private Graphics drowGraphics(BufferedImage image){
        // 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
        Graphics g = image.getGraphics();
        g.fillRect(0, 0, image.getWidth(), image.getHeight());
        g.setFont(new Font(FONT_TIMES_NEW_ROMAN, Font.ROMAN_BASELINE, 18));
        g.setColor(getRandColor(110, 133));
        return g;
    }

    /**
     * 绘制字符串
     */
    private String drowString(Graphics g, String randomString, int i, String randString) {
        g.setFont(getFont());
        g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
                .nextInt(121)));
        String rand = String.valueOf(getRandomString(random.nextInt(randString
                .length()),randString));
        randomString += rand;
        g.translate(random.nextInt(3), random.nextInt(3));
        g.drawString(rand, 13 * i, 16);
        return randomString;
    }

    /**
     * 绘制干扰线
     */
    private void drawLine(Graphics g, int width, int height) {
        int x = random.nextInt(width);
        int y = random.nextInt(height);
        int xl = random.nextInt(13);
        int yl = random.nextInt(15);
        g.drawLine(x, y, x + xl, y + yl);
    }

    /**
     * 获取随机的字符
     */
    public String getRandomString(int num, String randString) {
        return String.valueOf(randString.charAt(num));
    }
}
